package prefixsum;

/**
 * 给你一个 非递减 有序整数数组 nums 。
 * 请你建立并返回一个整数数组 result，它跟 nums 长度相同，且result[i] 等于 nums[i] 与数组中所有其他元素差的绝对值之和。
 * 换句话说， result[i] 等于 sum(|nums[i]-nums[j]|) ，其中 0 <= j < nums.length 且 j != i （下标从 0 开始）。
 * <p>
 * 示例 1：
 * 输入：nums = [2,3,5]
 * 输出：[4,3,5]
 * 解释：假设数组下标从 0 开始，那么
 * result[0] = |2-2| + |2-3| + |2-5| = 0 + 1 + 3 = 4，
 * result[1] = |3-2| + |3-3| + |3-5| = 1 + 0 + 2 = 3，
 * result[2] = |5-2| + |5-3| + |5-5| = 3 + 2 + 0 = 5。
 * <p>
 * 示例 2：
 * 输入：nums = [1,4,6,8,10]
 * 输出：[24,15,13,15,21]
 *
 * @author Jisheng Huang
 * @version 20250525
 */
public class GetSumAbsDiff_1685 {
    /**
     * @param nums the given Integer array
     * @return the sum of all the absolute differences
     */
    public static int[] getSumAbsoluteDifferences(int[] nums) {
        int n = nums.length;
        int[] preSum = new int[n];
        preSum[0] = nums[0];

        for (int i = 1; i < n; ++i) {
            preSum[i] = nums[i] + preSum[i - 1];
        }

        int[] ret = new int[n];

        for (int i = 0; i < n; ++i) {
            int leftSum = (i + 1) * nums[i] - preSum[i];
            int rightSum = preSum[n - 1] - preSum[i] - (n - 1 - i) * nums[i];
            ret[i] = leftSum + rightSum;
        }

        return ret;
    }

    public static void main(String[] args) {
        int[] arr = {2, 3, 5};
        int[] ret = getSumAbsoluteDifferences(arr);

        for (int i : ret) {
            System.out.print(i + " ");
        }

        System.out.println();

        arr = new int[]{1, 4, 6, 8, 10};
        ret = getSumAbsoluteDifferences(arr);

        for (int i : ret) {
            System.out.print(i + " ");
        }
    }
}
